package com.rongkang.interview.juc.arraynotsafe;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * @Description:
 * @author: 荣康
 * @date: 2021/12/2
 * <p>
 * arrayList线程不安全，因为add操作没有加锁，单线程情况下不会出错
 * <p>
 * arrayList线程不安全，因为add操作没有加锁，单线程情况下不会出错
 */

/**
 * arrayList线程不安全，因为add操作没有加锁，单线程情况下不会出错
 */

/**
 *  CopyOnWrite容器即写时复制的容器，往一个容器添加元素的时候，不直接往当前容器Object[]添加，
 *  而是先将当前容器Object[]进行copy，复制出一个新的容器，Object[],new Elements，然后新的容器Object[]里添加元素，添加完元素之后，
 *  再将原容器的引用指向新的容器，setArray(newElements),这样的好处是可以对CopyOnWrite容器进行并发的读，而不需要加锁，因为当前的容器
 *  并不回添加任何元素，所以CopyOnWrite容器也是一种读写分离的思想，读和写不同的容器
 */
public class ContainerNotSafeDemo {
    public static void main(String[] args) {


    }

    private static void ArrayListNotSafe() {
//        List<String> list = new ArrayList<>();
//        List<Object> list = Collections.synchronizedList(new ArrayList<>());
        List<String> list = new CopyOnWriteArrayList<>();
        for (int i = 0; i < 30; i++) {
            new Thread(() -> {
                list.add(UUID.randomUUID().toString().substring(0, 5));
                System.out.println(list);
            }, String.valueOf(i)).start();
        }

        /**
         *  1.故障现象 ： java.util.ConcurrentModificationException
         *  2.导致原因 : 并发争抢修改导致，参考花名册
         *     一个同学正在写入，另外一个同学也要写入，两个人互相争抢笔，导致在纸上弄了一堆墨水
         *  3.解决方法
         *          1.使用vector，是线程安全的
         *          2.Collections.synchronizedList(new ArrayList<>());
         *          3.CopyOnWriteArrayList
         *  4.优化建议(同样的代码不出问题)
         */}
}
